#pragma once
#include <jni.h>
#include <string>
#include <memory>

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#include <libswscale/swscale.h>
}

class FFmpegWrapper {
public:
    FFmpegWrapper();
    ~FFmpegWrapper();
    
    // 初始化FFmpeg
    bool initialize();
    
    // 打开媒体文件
    bool openMedia(const std::string& filePath);
    
    // 获取媒体信息
    struct MediaInfo {
        int width;
        int height;
        double duration;
        int bitrate;
        std::string codec;
    };
    
    MediaInfo getMediaInfo();
    
    // 解码相关
    bool startDecoding();
    bool stopDecoding();
    
    // 播放控制
    bool play();
    bool pause();
    bool stop();
    bool seek(double time);
    
    // 音量控制
    void setVolume(double volume);
    
    // 清理资源
    void cleanup();
    
private:
    AVFormatContext* formatContext_;
    AVCodecContext* videoCodecContext_;
    AVCodecContext* audioCodecContext_;
    AVFrame* frame_;
    AVPacket* packet_;
    SwsContext* swsContext_;
    
    bool isInitialized_;
    bool isPlaying_;
    double currentTime_;
    double duration_;
    
    // 内部方法
    bool setupVideoDecoder();
    bool setupAudioDecoder();
    void cleanupCodecContexts();
};
